
#ifndef OBJECT_H_
#define OBJECT_H_
#include <gl\gl.h>		
#include <gl\glu.h>		
#include <gl\glut.h>	
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <fstream>
#include <iostream>
//#include <windows.h>
using namespace std;
struct ListV {
	int list;
	int rank;
	static bool cmp(ListV a, ListV b) {
		return a.rank<b.rank;
	}
	static bool cmpic(ListV a, ListV b) {
		return a.rank>b.rank;
	}
};
struct MyV {
	GLdouble x, y, z;
	GLfloat list[3];
	MyV(GLfloat _x, GLfloat _y, GLfloat _z) {
		x=_x;
		y=_y;
		z=_z;
	}
	MyV() {
	}
	GLfloat mod()
	{
		return sqrt(x*x+y*y+z*z);
	}
	MyV operator+(MyV A) {
		MyV T=(*this);
		T.x=x+A.x;
		T.y=y+A.y;
		T.z=z+A.z;
		return T;
	}
	MyV operator/(GLfloat a) {
		MyV T=(*this);
		T.x/=a;
		T.y/=a;
		return T;
	}
	MyV operator*(GLfloat a) {
		MyV T=(*this);
		T.x*=a;
		T.y*=a;
		T.z*=a;
		return T;
	}
	MyV operator-(MyV A) {
		MyV T=(*this);
		T.x=x-A.x;
		T.y=y-A.y;
		T.z=z-A.z;
		//		cout<<"xyz:"<<A.x<<A.y<<A.z<<endl;
		return T;
	}
	MyV flip()
	{
		MyV T=(*this);
		T.x=-x;
		T.y=y;
		return T;
	}
	void Rotate(GLfloat angle)
	{
		MyV T;
		T.x=(x)*cos(angle)-y*sin(angle);
		T.y=(y)*cos(angle)+(x)*sin(angle);
		x=T.x;
		y=T.y;
	}
	GLfloat Cross(MyV B) {
		return x*B.y-B.x*y;
	}
	GLfloat dot(MyV B) {
		return x*B.x+B.y*y;
	}
	GLfloat AngleFrom(MyV B)
	{
		MyV T=MyV(x,y,0);
		return acos((T.dot(B))/(T.mod()*B.mod()));
	}
	GLfloat Dis(MyV B) {
		return sqrt((x-B.x)*(x-B.x)+(y-B.y)*(y-B.y));
	}
	const GLfloat* V() {
		list[0]=x;
		list[1]=y;
		list[2]=z;
		return list;
	}
};
struct Color {
	GLubyte r, g, b;
	GLubyte list[3];
	Color(GLbyte _r, GLbyte _g, GLbyte _b) {
		r=_r;
		g=_g;
		b=_b;
	}
	Color() {
	}

	Color operator+(Color A) {
		Color T=(*this);
		T.r=r+A.r;
		T.g=g+A.g;
		T.b=b+A.b;
		return T;
	}
	Color operator-(Color A) {
		Color T=(*this);
		T.r=r-A.r;
		T.g=g-A.g;
		T.b=b-A.b;
		//		cout<<"xyz:"<<A.r<<A.g<<A.b<<endl;
		return T;
	}
	const GLubyte* V() {
		list[0]=r;
		list[1]=g;
		list[2]=b;
		return list;
	}
	Color operator/(GLubyte a) {
		Color T=(*this);
		T.r/=a;
		T.g/=a;
		T.b/=a;
		return T;
	}
};
#endif /*OBJECT_H_*/
